home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- from test.test_support import verify, verbose, TestFailed, vereq
- import sys
- import gc
- import weakref
-
- def expect(actual, expected, name):
- if actual != expected:
- raise TestFailed, 'test_%s: actual %r, expected %r' % (name, actual, expected)
-
-
-
- def expect_nonzero(actual, name):
- if actual == 0:
- raise TestFailed, 'test_%s: unexpected zero' % name
-
-
-
- def run_test(name, thunk):
- if verbose:
- print 'testing %s...' % name,
-
- thunk()
- if verbose:
- print 'ok'
-
-
-
- def test_list():
- l = []
- l.append(l)
- gc.collect()
- del l
- expect(gc.collect(), 1, 'list')
-
-
- def test_dict():
- d = { }
- d[1] = d
- gc.collect()
- del d
- expect(gc.collect(), 1, 'dict')
-
-
- def test_tuple():
- l = []
- t = (l,)
- l.append(t)
- gc.collect()
- del t
- del l
- expect(gc.collect(), 2, 'tuple')
-
-
- def test_class():
-
- class A:
- pass
-
- A.a = A
- gc.collect()
- del A
- expect_nonzero(gc.collect(), 'class')
-
-
- def test_newstyleclass():
-
- class A(object):
- pass
-
- gc.collect()
- del A
- expect_nonzero(gc.collect(), 'staticclass')
-
-
- def test_instance():
-
- class A:
- pass
-
- a = A()
- a.a = a
- gc.collect()
- del a
- expect_nonzero(gc.collect(), 'instance')
-
-
- def test_newinstance():
-
- class A(object):
- pass
-
- a = A()
- a.a = a
- gc.collect()
- del a
- expect_nonzero(gc.collect(), 'newinstance')
-
- class B(list):
- pass
-
-
- class C(B, A):
- pass
-
- a = C()
- a.a = a
- gc.collect()
- del a
- expect_nonzero(gc.collect(), 'newinstance(2)')
- del B
- del C
- expect_nonzero(gc.collect(), 'newinstance(3)')
- A.a = A()
- del A
- expect_nonzero(gc.collect(), 'newinstance(4)')
- expect(gc.collect(), 0, 'newinstance(5)')
-
-
- def test_method():
-
- class A:
-
- def __init__(self):
- self.init = self.__init__
-
-
- a = A()
- gc.collect()
- del a
- expect_nonzero(gc.collect(), 'method')
-
-
- def test_finalizer():
-
- class A:
-
- def __del__(self):
- pass
-
-
-
- class B:
- pass
-
- a = A()
- a.a = a
- id_a = id(a)
- b = B()
- b.b = b
- gc.collect()
- del a
- del b
- expect_nonzero(gc.collect(), 'finalizer')
- for obj in gc.garbage:
- if id(obj) == id_a:
- del obj.a
- break
- continue
- else:
- raise TestFailed, "didn't find obj in garbage (finalizer)"
- gc.garbage.remove(obj)
-
-
- def test_finalizer_newclass():
-
- class A(object):
-
- def __del__(self):
- pass
-
-
-
- class B(object):
- pass
-
- a = A()
- a.a = a
- id_a = id(a)
- b = B()
- b.b = b
- gc.collect()
- del a
- del b
- expect_nonzero(gc.collect(), 'finalizer')
- for obj in gc.garbage:
- if id(obj) == id_a:
- del obj.a
- break
- continue
- else:
- raise TestFailed, "didn't find obj in garbage (finalizer)"
- gc.garbage.remove(obj)
-
-
- def test_function():
- d = { }
- exec 'def f(): pass\n' in d
- gc.collect()
- del d
- expect(gc.collect(), 2, 'function')
-
-
- def test_frame():
-
- def f():
- frame = sys._getframe()
-
- gc.collect()
- f()
- expect(gc.collect(), 1, 'frame')
-
-
- def test_saveall():
- gc.collect()
- vereq(gc.garbage, [])
- L = []
- L.append(L)
- id_L = id(L)
- debug = gc.get_debug()
- gc.set_debug(debug | gc.DEBUG_SAVEALL)
- del L
- gc.collect()
- gc.set_debug(debug)
- vereq(len(gc.garbage), 1)
- obj = gc.garbage.pop()
- vereq(id(obj), id_L)
-
-
- def test_del():
- thresholds = gc.get_threshold()
- gc.enable()
- gc.set_threshold(1)
-
- class A:
-
- def __del__(self):
- dir(self)
-
-
- a = A()
- del a
- gc.disable()
- gc.set_threshold(*thresholds)
-
-
- def test_del_newclass():
- thresholds = gc.get_threshold()
- gc.enable()
- gc.set_threshold(1)
-
- class A(object):
-
- def __del__(self):
- dir(self)
-
-
- a = A()
- del a
- gc.disable()
- gc.set_threshold(*thresholds)
-
-
- class Ouch:
- n = 0
-
- def __del__(self):
- Ouch.n = Ouch.n + 1
- if Ouch.n % 17 == 0:
- gc.collect()
-
-
-
-
- def test_trashcan():
- gc.enable()
- N = 150
- for count in range(2):
- t = []
- for i in range(N):
- t = [
- t,
- Ouch()]
-
- u = []
- for i in range(N):
- u = [
- u,
- Ouch()]
-
- v = { }
- for i in range(N):
- v = {
- 1: v,
- 2: Ouch() }
-
-
- gc.disable()
-
-
- class Boom:
-
- def __getattr__(self, someattribute):
- del self.attr
- raise AttributeError
-
-
-
- def test_boom():
- a = Boom()
- b = Boom()
- a.attr = b
- b.attr = a
- gc.collect()
- garbagelen = len(gc.garbage)
- del a
- del b
- expect(gc.collect(), 4, 'boom')
- expect(len(gc.garbage), garbagelen, 'boom')
-
-
- class Boom2:
-
- def __init__(self):
- self.x = 0
-
-
- def __getattr__(self, someattribute):
- self.x += 1
- if self.x > 1:
- del self.attr
-
- raise AttributeError
-
-
-
- def test_boom2():
- a = Boom2()
- b = Boom2()
- a.attr = b
- b.attr = a
- gc.collect()
- garbagelen = len(gc.garbage)
- del a
- del b
- expect(gc.collect(), 4, 'boom2')
- expect(len(gc.garbage), garbagelen, 'boom2')
-
-
- class Boom_New(object):
-
- def __getattr__(self, someattribute):
- del self.attr
- raise AttributeError
-
-
-
- def test_boom_new():
- a = Boom_New()
- b = Boom_New()
- a.attr = b
- b.attr = a
- gc.collect()
- garbagelen = len(gc.garbage)
- del a
- del b
- expect(gc.collect(), 4, 'boom_new')
- expect(len(gc.garbage), garbagelen, 'boom_new')
-
-
- class Boom2_New(object):
-
- def __init__(self):
- self.x = 0
-
-
- def __getattr__(self, someattribute):
- self.x += 1
- if self.x > 1:
- del self.attr
-
- raise AttributeError
-
-
-
- def test_boom2_new():
- a = Boom2_New()
- b = Boom2_New()
- a.attr = b
- b.attr = a
- gc.collect()
- garbagelen = len(gc.garbage)
- del a
- del b
- expect(gc.collect(), 4, 'boom2_new')
- expect(len(gc.garbage), garbagelen, 'boom2_new')
-
-
- def test_get_referents():
- alist = [
- 1,
- 3,
- 5]
- got = gc.get_referents(alist)
- got.sort()
- expect(got, alist, 'get_referents')
- atuple = tuple(alist)
- got = gc.get_referents(atuple)
- got.sort()
- expect(got, alist, 'get_referents')
- adict = {
- 1: 3,
- 5: 7 }
- expected = [
- 1,
- 3,
- 5,
- 7]
- got = gc.get_referents(adict)
- got.sort()
- expect(got, expected, 'get_referents')
- got = gc.get_referents([
- 1,
- 2], {
- 3: 4 }, (0, 0, 0))
- got.sort()
- expect(got, [
- 0,
- 0] + range(5), 'get_referents')
- expect(gc.get_referents(1, 'a', (0.0+4.0j)), [], 'get_referents')
-
-
- class C1055820(object):
-
- def __init__(self, i):
- self.i = i
- self.loop = self
-
-
-
- class GC_Detector(object):
-
- def __init__(self):
- self.gc_happened = False
-
- def it_happened(ignored):
- self.gc_happened = True
-
- self.wr = weakref.ref(C1055820(666), it_happened)
-
-
-
- def test_bug1055820b():
- ouch = []
-
- def callback(ignored):
- ouch[:] = [ wr() for wr in WRs ]
-
- Cs = [ C1055820(i) for i in range(2) ]
- WRs = [ weakref.ref(c, callback) for c in Cs ]
- c = None
- gc.collect()
- expect(len(ouch), 0, 'bug1055820b')
- Cs = None
- gc.collect()
- expect(len(ouch), 2, 'bug1055820b')
- for x in ouch:
- expect(x, None, 'bug1055820b')
-
-
-
- def test_bug1055820c():
- c0 = C1055820(0)
- gc.collect()
- c1 = C1055820(1)
- c1.keep_c0_alive = c0
- del c0.loop
- c2 = C1055820(2)
- c2wr = weakref.ref(c2)
- ouch = []
-
- def callback(ignored):
- ouch[:] = [
- c2wr()]
-
- c0wr = weakref.ref(c0, callback)
- c0 = None
- c1 = None
- c2 = None
- junk = []
- i = 0
- detector = GC_Detector()
- while not detector.gc_happened:
- i += 1
- if i > 10000:
- raise TestFailed("gc didn't happen after 10000 iterations")
-
- expect(len(ouch), 0, 'bug1055820c')
- junk.append([])
- expect(len(ouch), 1, 'bug1055820c')
- for x in ouch:
- expect(x, None, 'bug1055820c')
-
-
-
- def test_bug1055820d():
- ouch = []
-
- class D(C1055820):
-
- def __del__(self):
- ouch[:] = [
- c2wr()]
-
-
- d0 = D(0)
- gc.collect()
- c1 = C1055820(1)
- c1.keep_d0_alive = d0
- del d0.loop
- c2 = C1055820(2)
- c2wr = weakref.ref(c2)
- d0 = None
- c1 = None
- c2 = None
- detector = GC_Detector()
- junk = []
- i = 0
- while not detector.gc_happened:
- i += 1
- if i > 10000:
- raise TestFailed("gc didn't happen after 10000 iterations")
-
- expect(len(ouch), 0, 'bug1055820d')
- junk.append([])
- expect(len(ouch), 1, 'bug1055820d')
- for x in ouch:
- expect(x, None, 'bug1055820d')
-
-
-
- def test_all():
- gc.collect()
- run_test('lists', test_list)
- run_test('dicts', test_dict)
- run_test('tuples', test_tuple)
- run_test('classes', test_class)
- run_test('new style classes', test_newstyleclass)
- run_test('instances', test_instance)
- run_test('new instances', test_newinstance)
- run_test('methods', test_method)
- run_test('functions', test_function)
- run_test('frames', test_frame)
- run_test('finalizers', test_finalizer)
- run_test('finalizers (new class)', test_finalizer_newclass)
- run_test('__del__', test_del)
- run_test('__del__ (new class)', test_del_newclass)
- run_test('saveall', test_saveall)
- run_test('trashcan', test_trashcan)
- run_test('boom', test_boom)
- run_test('boom2', test_boom2)
- run_test('boom_new', test_boom_new)
- run_test('boom2_new', test_boom2_new)
- run_test('get_referents', test_get_referents)
- run_test('bug1055820b', test_bug1055820b)
- gc.enable()
-
- try:
- run_test('bug1055820c', test_bug1055820c)
- finally:
- gc.disable()
-
- gc.enable()
-
- try:
- run_test('bug1055820d', test_bug1055820d)
- finally:
- gc.disable()
-
-
-
- def test():
- if verbose:
- print 'disabling automatic collection'
-
- enabled = gc.isenabled()
- gc.disable()
- verify(not gc.isenabled())
- debug = gc.get_debug()
- gc.set_debug(debug & ~(gc.DEBUG_LEAK))
-
- try:
- test_all()
- finally:
- gc.set_debug(debug)
- gc.enable()
- verify(gc.isenabled())
- if not enabled:
- gc.disable()
-
-
-
- test()
-